`
https://leetcode.cn/problems/subsets/
`

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var subsets = function (nums) {
  // 用于存储结果
  const res = []

  // 用于记录回溯路径
  const track = []

  // 回溯算法核心函数，遍历子集问题的回溯树
  const backtrack = (start) => {
    // 前序遍历位置，每个节点的值都是一个子集
    res.push([...track])

    // 回溯算法标准框架
    for (let i = start; i < nums.length; i++) {
      // 做选择
      track.push(nums[i])
      // 回溯遍历下一层节点
      backtrack(i + 1)
      // 撤销选择
      track.pop()
    }
  }

  backtrack(0)

  return res
};